package com.atxiaodei.rabbitmq.topic;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @ClassName Producer
 * @Deacription 简单模式
 * @Author 诸葛孔暗
 * @Date 2021/3/22 11:16
 * @Version 1.0
 **/
public class Producer {
    public static void main(String[] args)  {
        // 所有的中间件技术都是基于tcp/ip 协议基础上构建新型的协议规范，只不过rabbitmq遵循的是amqp协议

        // ip port

        // 1、创建连接工程
        ConnectionFactory connectionFactory=new ConnectionFactory();

        connectionFactory.setHost("172.20.10.4");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        connectionFactory.setVirtualHost("/");
        connectionFactory.setConnectionTimeout(3600);

        Connection connection=null;
        Channel channel =null;
        try {
            // 2、创建连接Connection
            connection = connectionFactory.newConnection("消息生产者");
            // 3、通过连接获取通道Channel
            channel = connection.createChannel();
            // 4、通过通道创建交换机，声明队列，绑定关系，路由key，发送消息和接收消息
            String exchangeName="topic-exchange";
            /**
             * @params1:队列名称
             * @params2:是否要持久化 所谓的持久化消息是否存盘，如果false 非持久化 true是持久化
             * 非持久化会存盘？ 答案是：会存盘，但是会随着rabbitmq-server服务重启会丢失
             * @params3:排他性，是否是独占独立
             * @params4:是否自动删除，随着最后一个消费者接收完毕消息后是否把队列自动删除
             * @params5:携带的附属参数
             */
            // 这里如果queue已经被创建过一次了，可以不需要定义
            // channel.queueDeclare(queueName,true,false,false,null);
            // 5、准备发送消息
            String message="Hello rabbitmq,这是生产者发送的第一个消息,Topic模式，Topic模式是direct模式上的一种叠加，增加了模糊路由RoutingKey的模式";
            String routingKey1="com.zhuce.atxiaodei";
            String routingKey2="denglu.com.atxiaodei";
            // 6、发送消息给队列queue
            /**
             * 参数1：交换机
             * 参数2：队列/路由key
             * 参数3：消息的状态控制
             * 参数4：消息主体
             *  可以存在没有交换机的队列？
             *  答案是：不可以的，虽然没有指定交换机但是一定会存在一个默认的交换机的
             *
             */
            channel.basicPublish(exchangeName,routingKey1,null,message.getBytes());
            channel.basicPublish(exchangeName,routingKey2,null,message.getBytes());
            System.out.println("消息发送成功！");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("生产者发送消息异常！");
        }finally {
            // 7、关闭通道
            if (channel !=null && channel.isOpen()){
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 8、关闭连接
            if (connection !=null && connection.isOpen()){
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
